(function webpackUniversalModuleDefinition(root, factory) {
  if (typeof exports === "object" && typeof module === "object")
    module.exports = factory(require("echarts"));
  else if (typeof define === "function" && define.amd)
    define(["echarts"], factory);
  else if (typeof exports === "object")
    exports["bmap"] = factory(require("echarts"));
  else
    (root["echarts"] = root["echarts"] || {}),
      (root["echarts"]["bmap"] = factory(root["echarts"]));
})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) {
  return /******/ (function(modules) {
    // webpackBootstrap
    /******/ // The module cache
    /******/ var installedModules = {}; // The require function

    /******/ /******/ function __webpack_require__(moduleId) {
      /******/ // Check if module is in cache
      /******/ if (installedModules[moduleId])
        /******/ return installedModules[moduleId].exports; // Create a new module (and put it into the cache)

      /******/ /******/ var module = (installedModules[moduleId] = {
        /******/ exports: {},
        /******/ id: moduleId,
        /******/ loaded: false
        /******/
      }); // Execute the module function

      /******/ /******/ modules[moduleId].call(
        module.exports,
        module,
        module.exports,
        __webpack_require__
      ); // Flag the module as loaded

      /******/ /******/ module.loaded = true; // Return the exports of the module

      /******/ /******/ return module.exports;
      /******/
    } // expose the modules object (__webpack_modules__)

    /******/ /******/ __webpack_require__.m = modules; // expose the module cache

    /******/ /******/ __webpack_require__.c = installedModules; // __webpack_public_path__

    /******/ /******/ __webpack_require__.p = ""; // Load entry module and return exports

    /******/ /******/ return __webpack_require__(0);
    /******/
  })(
    /************************************************************************/
    /******/ [
      /* 0 */
      /***/ function(module, exports, __webpack_require__) {
        var __WEBPACK_AMD_DEFINE_RESULT__;
        /**
         * BMap component extension
         */
        !((__WEBPACK_AMD_DEFINE_RESULT__ = function(require) {
          __webpack_require__(1).registerCoordinateSystem(
            "bmap",
            __webpack_require__(2)
          );
          __webpack_require__(3);
          __webpack_require__(4);

          // Action
          __webpack_require__(1).registerAction(
            {
              type: "bmapRoam",
              event: "bmapRoam",
              update: "updateLayout"
            },
            function(payload, ecModel) {
              ecModel.eachComponent("bmap", function(bMapModel) {
                var bmap = bMapModel.getBMap();
                var center = bmap.getCenter();
                bMapModel.setCenterAndZoom(
                  [center.lng, center.lat],
                  bmap.getZoom()
                );
              });
            }
          );

          return {
            version: "1.0.0"
          };
        }.call(exports, __webpack_require__, exports, module)),
        __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
          (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

        /***/
      },
      /* 1 */
      /***/ function(module, exports) {
        module.exports = __WEBPACK_EXTERNAL_MODULE_1__;

        /***/
      },
      /* 2 */
      /***/ function(module, exports, __webpack_require__) {
        var __WEBPACK_AMD_DEFINE_RESULT__;
        !((__WEBPACK_AMD_DEFINE_RESULT__ = function(require) {
          var echarts = __webpack_require__(1);

          function BMapCoordSys(bmap, api) {
            this._bmap = bmap;
            this.dimensions = ["lng", "lat"];
            this._mapOffset = [0, 0];

            this._api = api;
          }

          BMapCoordSys.prototype.dimensions = ["lng", "lat"];

          BMapCoordSys.prototype.setMapOffset = function(mapOffset) {
            this._mapOffset = mapOffset;
          };

          BMapCoordSys.prototype.getBMap = function() {
            return this._bmap;
          };

          BMapCoordSys.prototype.dataToPoint = function(data) {
            var point = new BMap.Point(data[0], data[1]);
            // TODO pointToOverlayPixel is toooooooo slow, cache the transform
            var px = this._bmap.pointToOverlayPixel(point);
            var mapOffset = this._mapOffset;
            return [px.x - mapOffset[0], px.y - mapOffset[1]];
          };

          BMapCoordSys.prototype.pointToData = function(pt) {
            var mapOffset = this._mapOffset;
            var pt = this._bmap.overlayPixelToPoint({
              x: pt[0] + mapOffset[0],
              y: pt[1] + mapOffset[1]
            });
            return [pt.lng, pt.lat];
          };

          BMapCoordSys.prototype.getViewRect = function() {
            var api = this._api;
            return new echarts.graphic.BoundingRect(
              0,
              0,
              api.getWidth(),
              api.getHeight()
            );
          };

          BMapCoordSys.prototype.getRoamTransform = function() {
            return echarts.matrix.create();
          };

          var Overlay;

          // For deciding which dimensions to use when creating list data
          BMapCoordSys.dimensions = BMapCoordSys.prototype.dimensions;

          function createOverlayCtor() {
            function Overlay(root) {
              this._root = root;
            }

            Overlay.prototype = new BMap.Overlay();
            /**
             * 初始化
             *
             * @param {BMap.Map} map
             * @override
             */
            Overlay.prototype.initialize = function(map) {
              map.getPanes().labelPane.appendChild(this._root);
              return this._root;
            };
            /**
             * @override
             */
            Overlay.prototype.draw = function() {};

            return Overlay;
          }

          BMapCoordSys.create = function(ecModel, api) {
            var bmapCoordSys;
            var root = api.getDom();

            // TODO Dispose
            ecModel.eachComponent("bmap", function(bmapModel) {
              var viewportRoot = api.getZr().painter.getViewportRoot();
              if (typeof BMap === "undefined") {
                throw new Error("BMap api is not loaded");
              }
              Overlay = Overlay || createOverlayCtor();
              if (bmapCoordSys) {
                throw new Error("Only one bmap component can exist");
              }
              if (!bmapModel.__bmap) {
                // Not support IE8
                var bmapRoot = root.querySelector(".ec-extension-bmap");
                if (bmapRoot) {
                  // Reset viewport left and top, which will be changed
                  // in moving handler in BMapView
                  viewportRoot.style.left = "0px";
                  viewportRoot.style.top = "0px";
                  root.removeChild(bmapRoot);
                }
                bmapRoot = document.createElement("div");
                bmapRoot.style.cssText = "width:100%;height:100%";
                // Not support IE8
                bmapRoot.classList.add("ec-extension-bmap");
                root.appendChild(bmapRoot);
                var bmap = (bmapModel.__bmap = new BMap.Map(bmapRoot));

                var overlay = new Overlay(viewportRoot);
                bmap.addOverlay(overlay);
              }
              var bmap = bmapModel.__bmap;

              // Set bmap options
              // centerAndZoom before layout and render
              var center = bmapModel.get("center");
              var zoom = bmapModel.get("zoom");
              if (center && zoom) {
                var pt = new BMap.Point(center[0], center[1]);
                bmap.centerAndZoom(pt, zoom);
              }

              bmapCoordSys = new BMapCoordSys(bmap, api);
              bmapCoordSys.setMapOffset(bmapModel.__mapOffset || [0, 0]);
              bmapModel.coordinateSystem = bmapCoordSys;
            });

            ecModel.eachSeries(function(seriesModel) {
              if (seriesModel.get("coordinateSystem") === "bmap") {
                seriesModel.coordinateSystem = bmapCoordSys;
              }
            });
          };

          return BMapCoordSys;
        }.call(exports, __webpack_require__, exports, module)),
        __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
          (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

        /***/
      },
      /* 3 */
      /***/ function(module, exports, __webpack_require__) {
        var __WEBPACK_AMD_DEFINE_RESULT__;
        !((__WEBPACK_AMD_DEFINE_RESULT__ = function(require) {
          function v2Equal(a, b) {
            return a && b && a[0] === b[0] && a[1] === b[1];
          }

          return __webpack_require__(1).extendComponentModel({
            type: "bmap",

            getBMap: function() {
              // __bmap is injected when creating BMapCoordSys
              return this.__bmap;
            },

            setCenterAndZoom: function(center, zoom) {
              this.option.center = center;
              this.option.zoom = zoom;
            },

            centerOrZoomChanged: function(center, zoom) {
              var option = this.option;
              return !(v2Equal(center, option.center) && zoom === option.zoom);
            },

            defaultOption: {
              center: [104.114129, 37.550339],

              zoom: 5,

              mapStyle: {},

              roam: false
            }
          });
        }.call(exports, __webpack_require__, exports, module)),
        __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
          (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

        /***/
      },
      /* 4 */
      /***/ function(module, exports, __webpack_require__) {
        var __WEBPACK_AMD_DEFINE_RESULT__;
        !((__WEBPACK_AMD_DEFINE_RESULT__ = function(require) {
          return __webpack_require__(1).extendComponentView({
            type: "bmap",

            render: function(bMapModel, ecModel, api) {
              var rendering = true;

              var bmap = bMapModel.getBMap();
              var viewportRoot = api.getZr().painter.getViewportRoot();
              var coordSys = bMapModel.coordinateSystem;
              var moveHandler = function(type, target) {
                if (rendering) {
                  return;
                }
                var offsetEl = viewportRoot.parentNode.parentNode.parentNode;
                var mapOffset = [
                  -parseInt(offsetEl.style.left, 10) || 0,
                  -parseInt(offsetEl.style.top, 10) || 0
                ];
                viewportRoot.style.left = mapOffset[0] + "px";
                viewportRoot.style.top = mapOffset[1] + "px";

                coordSys.setMapOffset(mapOffset);
                bMapModel.__mapOffset = mapOffset;

                api.dispatchAction({
                  type: "bmapRoam"
                });
              };

              function zoomEndHandler() {
                if (rendering) {
                  return;
                }
                api.dispatchAction({
                  type: "bmapRoam"
                });
              }

              bmap.removeEventListener("moving", this._oldMoveHandler);
              // FIXME
              // Moveend may be triggered by centerAndZoom method when creating coordSys next time
              // bmap.removeEventListener('moveend', this._oldMoveHandler);
              bmap.removeEventListener("zoomend", this._oldZoomEndHandler);
              bmap.addEventListener("moving", moveHandler);
              // bmap.addEventListener('moveend', moveHandler);
              bmap.addEventListener("zoomend", zoomEndHandler);

              this._oldMoveHandler = moveHandler;
              this._oldZoomEndHandler = zoomEndHandler;

              var roam = bMapModel.get("roam");
              if (roam && roam !== "scale") {
                bmap.enableDragging();
              } else {
                bmap.disableDragging();
              }
              if (roam && roam !== "move") {
                bmap.enableScrollWheelZoom();
                bmap.enableDoubleClickZoom();
                bmap.enablePinchToZoom();
              } else {
                bmap.disableScrollWheelZoom();
                bmap.disableDoubleClickZoom();
                bmap.disablePinchToZoom();
              }

              var originalStyle = bMapModel.__mapStyle;

              var newMapStyle = bMapModel.get("mapStyle") || {};
              // FIXME, Not use JSON methods
              var mapStyleStr = JSON.stringify(newMapStyle);
              if (JSON.stringify(originalStyle) !== mapStyleStr) {
                // FIXME May have blank tile when dragging if setMapStyle
                if (Object.keys(newMapStyle).length) {
                  bmap.setMapStyle(newMapStyle);
                }
                bMapModel.__mapStyle = JSON.parse(mapStyleStr);
              }

              rendering = false;
            }
          });
        }.call(exports, __webpack_require__, exports, module)),
        __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
          (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

        /***/
      }
      /******/
    ]
  );
});
